package br.com.pessoafisica;

import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.util.Random;

import br.com.validadores.Validadores;

public class Cpf implements Validadores {
	
	@Override
	public void copiar(String documento) {
		
		Clipboard textoCpf = Toolkit.getDefaultToolkit().getSystemClipboard();
		StringSelection selection = new StringSelection(documento);
		textoCpf.setContents(selection, null);
		
	}

	@Override
	public String gerar() {
		
		String cpf = null;
		String numero = null;
		String verificador = null;
		
		numero = gerarAleatorio();
		verificador = gerarVerificadores(numero);
		cpf = numero + verificador;
		
		StringBuilder mascara = new StringBuilder(cpf);

		return mascara.insert(3, '.').insert(7, '.').insert(11, '-').toString();
		
	}

	private String gerarAleatorio() {
		
		int[] intNum = new int[9];
		String[] strNum = new String[intNum.length];

		StringBuilder num = new StringBuilder();
		String cpf = null;

		Random random = new Random();

		for (int i = 0; i < 9; i++) {

			intNum[i] = random.nextInt(9);
			strNum[i] = String.valueOf(intNum[i]);
			num.append(strNum[i]);

		}

		cpf = num.toString();
		return cpf;
		
	}

	private String gerarVerificadores(String documento) {
		
		int iDigito1Aux = 0;
		int iDigito2Aux = 0;
		int iDigitoCPF;
		int iDigito1 = 0;
		int iDigito2 = 0;
		int iRestoDivisao = 0;

		String strDigitoResultado = null;
		String digitosCpf = null;

		if (!documento.subSequence(0, 1).equals("")) {

			try {

				documento = documento.replace('.', ' ').replace('-', ' ')
						.replace(" ", "");
				
				digitosCpf = documento;
				
				/* Primeira Parte */
				for (int iCont = 1; iCont < digitosCpf.length() + 1; iCont++) {
					
					iDigitoCPF = Integer.valueOf(digitosCpf.substring(iCont - 1, iCont)).intValue();
					iDigito1Aux = iDigito1Aux + (11 - iCont) * iDigitoCPF;
					
				}

				iRestoDivisao = iDigito1Aux % 11;
				
				if (iRestoDivisao < 2) {
					
					iDigito1 = 0;
					
				} else {
					
					iDigito1 = 11 - iRestoDivisao;
					
				}
				
				/* Segunda Parte */
				digitosCpf = digitosCpf + String.valueOf(iDigito1);
				
				for (int iCont = 1; iCont < digitosCpf.length() + 1; iCont++) {
					
					iDigitoCPF = Integer.valueOf(digitosCpf.substring(iCont - 1, iCont));
					iDigito2Aux = iDigito2Aux + (12 - iCont) * iDigitoCPF;
					
				}
				
				iRestoDivisao = iDigito2Aux % 11;
				
				if (iRestoDivisao < 2) {
					
					iDigito2 = 0;
					
				} else {
					
					iDigito2 = 11 - iRestoDivisao;
					
				}
				
				strDigitoResultado = String.valueOf(iDigito1) + String.valueOf(iDigito2);
				
				return strDigitoResultado; 
				
			} catch (Exception e) {

				e.printStackTrace();

			}

		}
		
		return strDigitoResultado; 
		
	}

	@Override
	public boolean validar(String documento) {
		
		int iDigito1Aux = 0;
		int iDigito2Aux = 0;
		int iDigitoCPF;
		int iDigito1 = 0;
		int iDigito2 = 0;
		int iRestoDivisao = 0;

		String strDigitoVerificador;
		String strDigitoResultado = null;
		String digitosCpf = null;

		if (!documento.subSequence(0, 1).equals("")) {

			try {

				documento = documento.replace('.', ' ').replace('-', ' ')
						.replaceAll(" ", "");
				
				digitosCpf = documento;
				
				if (digitosCpf.length() < 11)
					return false;

				/* Primeira Parte */
				for (int iCont = 1; iCont < digitosCpf.length() - 1; iCont++) {
					
					iDigitoCPF = Integer.valueOf(digitosCpf.substring(iCont - 1, iCont)).intValue();
					iDigito1Aux = iDigito1Aux + (11 - iCont) * iDigitoCPF;
					
				}

				iRestoDivisao = iDigito1Aux % 11;
				
				if (iRestoDivisao < 2) {
					
					iDigito1 = 0;
					
				} else {
					
					iDigito1 = 11 - iRestoDivisao;
					
				}
				
				/* Segunda Parte */
				digitosCpf = digitosCpf + String.valueOf(iDigito1);
				
				for (int iCont = 1; iCont < digitosCpf.length() - 1; iCont++) {
					
					iDigitoCPF = Integer.valueOf(digitosCpf.substring(iCont - 1, iCont));
					iDigito2Aux = iDigito2Aux + (12 - iCont) * iDigitoCPF;
					
				}
				
				iRestoDivisao = iDigito2Aux % 11;
				
				if (iRestoDivisao < 2) {
					
					iDigito2 = 0;
					
				} else {
					
					iDigito2 = 11 - iRestoDivisao;
					
				}
				
				strDigitoVerificador = documento.substring(documento.length() - 2, documento.length());
				strDigitoResultado = String.valueOf(iDigito1) + String.valueOf(iDigito2);
				
				return strDigitoVerificador.equals(strDigitoResultado);
				
			} catch (Exception e) {

				return false;

			}

		} else {

			return false;

		}
		
	}
	
}
